package inge_soft.gestoriusNuevo.business.controller.implementation;

import java.util.List;

//import inge_soft.gestoriusNuevo.business.logic.MandarMailGmail;
import inge_soft.gestoriusNuevo.business.service.abstraction.IUsuarioService;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Documento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Domicilio;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Localidad;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Pais;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.TipoDocumento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Usuario;

import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;


@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class FormViewModel extends UsuarioFomulario {

	private String dateFormat;
	private int memoHeight = 6;
	private String foregroundColour = "#000000", backgroundColour = "#FDC966";

	private TipoDocumento tipoDocumentoElegido;
	private ListModel<TipoDocumento> listaTiposDocumento = null;
	private Documento documento = new Documento();
	private Pais nacionalidadElegida;
	private ListModel<Pais> listaNacionalidades = null;
	private ListModel<Pais> listaPaises = null;
	private ListModelList<Localidad> listaLocalidades = null;
	private Localidad localidadElegida;
	private Pais paisResidenciaElegido;
	private String cadenaIngresadaCodigoPostal;

	private Domicilio domicilio = new Domicilio();

	@WireVariable("usuarioService")
	private IUsuarioService usuarioService;

	public FormViewModel() {
		super();
	}

	public Documento getDocumento() {
		return documento;
	}

	public void setcadenaIngresadaCodigoPostal(String cadenaIngresadaCodigoPostal) {
		this.cadenaIngresadaCodigoPostal = cadenaIngresadaCodigoPostal;
		if (this.cadenaIngresadaCodigoPostal == null)
			System.out.println("Cadena ingresada en cod postal es null");
		else
			System.out.println("Cadena ingresada en cod postal: " + this.cadenaIngresadaCodigoPostal);
	}

	public Pais getPaisResidenciaElegido() {
		return paisResidenciaElegido;
	}

	public void setPaisResidenciaElegido(Pais paisResidenciaElegido) {
		this.paisResidenciaElegido = paisResidenciaElegido;
		if (this.paisResidenciaElegido == null)
			System.out.println("pais residencia es null");
		else
			System.out.println("pais residencia: " + this.paisResidenciaElegido.getNombre());
	}

	public ListModel<Localidad> getListaLocalidades() {
		return listaLocalidades;
	}

	public Localidad getLocalidadElegida() {
		return localidadElegida;
	}

	public void setLocalidadElegida(Localidad localidadElegida) {
		this.localidadElegida = localidadElegida;
	}

	public Domicilio getDomicilio() {
		return domicilio;
	}

	public void setDomicilio(Domicilio domicilio) {
		this.domicilio = domicilio;
	}

	public void setDocumento(String numero) {
		documento.setNumero(numero);
	}

	@Command
	public void actualizarListaLocalidades() {
		List<Localidad> listaConsultada = 
				usuarioService.obtenerTodasLasLocalidadesDePaisQueCoincidaConCodigoPostalOrdenadasPorNombreAscendente(
						this.paisResidenciaElegido, this.cadenaIngresadaCodigoPostal);
		if (listaLocalidades == null) {
			listaLocalidades = new ListModelList<Localidad>(listaConsultada);
		} else {
			listaLocalidades.clear();
			listaLocalidades.addAll(listaConsultada);
		}
	}

	public ListModel<Pais> getListaPaises() {
		if (listaPaises == null) {
			List<Pais> listaConsultada = usuarioService.obtenerTodosLosPaisesOrdenadosPorNombreNacionalidadAscendente();
			listaPaises = new ListModelList<Pais>(listaConsultada);
		}
		return listaPaises;
	}

	public ListModel<Pais> getListaNacionalidades() {
		if (listaNacionalidades == null) {
			List<Pais> listaConsultada = usuarioService.obtenerTodosLosPaisesOrdenadosPorNombreNacionalidadAscendente();
			listaNacionalidades = new ListModelList<Pais>(listaConsultada);
		}
		return listaNacionalidades;
	}

	public ListModel<TipoDocumento> getListaTiposDocumento() {
		if (listaTiposDocumento == null) {
			listaTiposDocumento = new ListModelList<TipoDocumento>(usuarioService.obtenerTodosTiposDocumentoOrdenadosPorNombreAscendente());
		}
		return listaTiposDocumento;
	}

	public Pais getNacionalidadElegida() {
		return nacionalidadElegida;
	}

	public void setNacionalidadElegida(Pais nacionalidadElegida) {
		this.nacionalidadElegida = nacionalidadElegida;
		if (this.nacionalidadElegida == null)
			System.out.println("NACIONALIDAD es null");
		else
			System.out.println("nacionalidad: " + nacionalidadElegida.getGentilicio());
	}

	public TipoDocumento getTipoDocumentoElegido() {
		return tipoDocumentoElegido;
	}

	public void setTipoDocumentoElegido(TipoDocumento tipoDocumentoElegido) {
		this.tipoDocumentoElegido = tipoDocumentoElegido;
		if (this.tipoDocumentoElegido == null) 
			System.out.println("TIPO DOCUMENTO es null");
		else
			System.out.println("Tipo documento: " + tipoDocumentoElegido.getNombre());
	}

	/*private List<TipoDocumento> crearListaTiposDocumento() {
		List<TipoDocumento> lista = new ArrayList<TipoDocumento>();
		TipoDocumento tipo1 = new TipoDocumento();
		tipo1.setNombre("UNICO");
		tipo1.setId(1L);
		TipoDocumento tipo2 = new TipoDocumento();
		tipo2.setNombre("DUPLICADO");
		tipo2.setId(2L);
		TipoDocumento tipo3 = new TipoDocumento();
		tipo3.setNombre("TERCERO");
		tipo3.setId(3L);
		TipoDocumento tipo4 = new TipoDocumento();
		tipo4.setNombre("tuplica ;)");
		tipo4.setId(4L);
		lista.add(tipo1);
		lista.add(tipo2);
		lista.add(tipo3);
		lista.add(tipo4);
		return lista;
	}*/

	public String getForegroundColour() {
		return foregroundColour;
	}

	public void setForegroundColour(String foregroundColor) {
		this.foregroundColour = foregroundColor;
	}

	public String getBackgroundColour() {
		return backgroundColour;
	}

	public void setBackgroundColour(String backgroundColor) {
		this.backgroundColour = backgroundColor;
	}

	public String getDateFormat() {
		return dateFormat;
	}

	public void setDateFormat(String dateFormat) {
		this.dateFormat = dateFormat;
	}

	public int getMemoHeight() {
		return memoHeight;
	}

	public void setMemoHeight(int memoHeight) {
		this.memoHeight = memoHeight;
	}

	@Command
	public void registrarse() {

		Usuario usuario = getUser();

		Domicilio domicilio = getDomicilio();
		domicilio.setLocalidad(getLocalidadElegida());
		usuario.setDomicilio(domicilio);

		Documento documento = getDocumento();
		documento.setTipoDocumento(getTipoDocumentoElegido());

		usuario.setDocumento(documento);

		usuario.setNacionalidad(getNacionalidadElegida());

		try {
			//usuarioService.crearUsuario(usuario, getUserR());
			
		} catch (Exception e) {
			
			String mensaje = "Error: Asegurese de ingresar los datos minimos (*)";
			Messagebox.show(mensaje,"Error",Messagebox.ABORT,Messagebox.ERROR);
			return;
		}

		Messagebox.show("----- Usted se registro correctamente ----- En breve se le enviara un mail con los datos de su cuenta ", "Registracion", Messagebox.OK, Messagebox.INFORMATION);

		//MandarMailGmail e = new MandarMailGmail("tolosarodrigo00@gmail.com","0292015571022");
		String mensaje = "----------- Bienvenido a GESTORIUS  --------           " +
				"                                                        "+
				"Nombre de usuario : "+ super.getUserR().getNick()+
				"Contrase�a : "+ super.getUserR().getContrasenia();
		//e.mandarMail("el.choly.93@gmail.com","Registracion Realizada", mensaje);
		//e.cerrarSeccion();
	}

}
